package com.study.dataStructure.tree;

/**
 * @author tiny
 * @date 2021/12/14 16:00
 * @Description: 顺序存储二叉树
 * 示例:
 *          1
 *       2     3
 *     4  5   6  7
 * 二叉树结构转换为数组结构后:
 *   [ 1, 2, 3, 4, 5, 6, 7 ]
 */
public class ArrayBinaryTree {

    private int[] arr;

    public ArrayBinaryTree(int[] arr){
        this.arr = arr;
    }

    /**
     * 顺序存储二叉树的
     * @param index 结点在顺序存储结构(数组)中的索引
     */
    public void preShow(int index){
        if(arr==null || arr.length==0){
            System.out.println("数组为空");
        }
        //输出当前结点
        System.out.println(arr[index]);

        //当前结点索引为i, 那么左子节点索引为 i*2+1 , 右子节点索引为 i*2+2

        //向左递归遍历
        if( index*2+1 < arr.length ){
            preShow(index*2+1);
        }

        //向右递归遍历
        if( index*2+2 < arr.length ){
            preShow(index*2+2);
        }

    }

    /**
     * 中序遍历顺序存储二叉树
     * @param index
     */
    public void midShow(int index){
        if(arr==null || arr.length==0){return;}
        if(index*2+1<arr.length){
            midShow(index*2+1);
        }

        System.out.println(arr[index]);

        if(index*2+2<arr.length){
            midShow(index*2+2);
        }
    }

    /**
     * 后序遍历顺序存储二叉树
     * @param index
     */
    public void postShow(int index){
        if(arr==null || arr.length==0){return;}

        if(index*2+1<arr.length){
            postShow(index*2+1);
        }

        if(index*2+2<arr.length){
            postShow(index*2+2);
        }

        System.out.println(arr[index]);
    }

    public void preShow() {
        preShow(0);
    }

    public void midShow(){
        midShow(0);
    }

    public void postShow(){
        postShow(0);
    }
}
